/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package org.juego.endpointwebsocket.websocket;

import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.websocket.EncodeException;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import org.juego.endpointwebsocket.decoder.DecEvento;
import org.juego.endpointwebsocket.encoder.EncEscenario;
import org.juego.endpointwebsocket.encoder.EncSigEscenario;
import org.juego.endpointwebsocket.util.Evento;
import org.juego.endpointwebsocket.util.SigEscenario;

/**
 *
 * @author MoisesAntonio
 */

/* Websocket endpoint ¡¡¡Atención, hay una instancia de esta clase por cada conexión!!!*/
@ServerEndpoint(
        value = "/websocketjuego",
        decoders = { DecEvento.class }, 
        encoders = { EncSigEscenario.class}
        )
public class JuegoEndpoint {
    
    //Esta variable solo la utilizo para saber que pasa en el flujo del servidor.
    //Es totalmente prescindible.
    private static final Logger logger = Logger.getLogger("JuegoLogger");
    
    @OnOpen
    public void openConnection(Session session) {
        logger.log(Level.INFO, "Connection opened.");
    }

    @OnMessage
    public void message(final Session session, Evento eve){
        logger.log(Level.INFO, "Received: {0}", eve.toString());
        //session.getUserProperties().put("", msg.getName());
        session.getUserProperties().put("active", true);
        //Hasta aquí esto funciona, es solo mensajes de texto
        SigEscenario escenario=new SigEscenario((eve.getEscenario()+1));
        send(session, escenario);
        logger.log(Level.INFO, "Sent: {0}", escenario.toString());
        
        //Esto es para probar a enviar imágenes.
        //File f=new File("c:/pruebas/0.png");
        //send(session, f);
    }
    
    @OnClose
    public void closedConnection(Session session) {
        session.getUserProperties().put("active", false);
        logger.log(Level.INFO, "Connection closed.");
    }
    
    @OnError
    public void error(Session session, Throwable t) {
        logger.log(Level.INFO, "Connection error ({0})", t.toString());
    }
    
    /**
     * Este método se encarga de enviar el mensaje de respuesta al cliente.
     * @param session
     * @param msg 
     */
    public void send(Session session, Object msg){
        try {
            session.getBasicRemote().sendObject(msg);
            logger.log(Level.INFO, "Mensaje enviado.");
        }catch (IOException | EncodeException e){
            logger.log(Level.WARNING, e.toString());
        }
    }
    
}
